home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_570 / gadtoolsbox / source / source.lha / ScreenSelect.c < prev    next >
C/C++ Source or Header  |  1991-11-04  |  13KB  |  388 lines

  1. /*-- AutoRev header do NOT edit!
  2. *
  3. *   Program         :   ScreenSelect.c
  4. *   Copyright       :   © Copyright 1991 Jaba Development
  5. *   Author          :   Jan van den Baard
  6. *   Creation Date   :   01-Oct-91
  7. *   Current version :   1.00
  8. *   Translator      :   DICE v2.6
  9. *
  10. *   REVISION HISTORY
  11. *
  12. *   Date          Version         Comment
  13. *   ---------     -------         ------------------------------------------
  14. *   01-Oct-91     1.00            Screen type requester.
  15. *
  16. *-- REV_END --*/
  17.  
  18. #include "GTEd.h"
  19. #include "Protos.h"
  20.  
  21. /*
  22.  * --- External referenced data
  23.  */
  24. extern ULONG                Class;
  25. extern UWORD                Code;
  26. extern struct Gadget       *Object;
  27. extern APTR                 MainVisualInfo;
  28. extern struct TextAttr      Topaz80;
  29. extern struct TagItem       MainSTags[];
  30. extern struct Screen       *MainScreen;
  31.  
  32. /*
  33.  * --- Gadget ID's
  34.  */
  35. #define GD_MODESELECT       0
  36. #define GD_DEPTH            1
  37. #define GD_OK               2
  38. #define GD_CANCEL           3
  39.  
  40. /*
  41.  * --- Module data
  42.  */
  43. struct Window              *sc_Wnd    = NULL;
  44. struct Gadget              *sc_GList  = NULL;
  45. struct Gadget              *sc_Slider = NULL;
  46. struct List                 sc_AvailModes;
  47. UWORD                       sc_ActiveMode = 1;
  48.  
  49. WORD                        sc_Zoom[4];
  50.  
  51. UWORD                       sc_Depth = 2l, sc_Width = 640, sc_Height;
  52. ULONG                       sc_DisplayID = DEFAULT_MONITOR_ID | HIRES_KEY;
  53.  
  54. struct TagItem              sc_nwTags[] = {
  55.     WA_Left,                0l,
  56.     WA_Top,                 0l,
  57.     WA_Width,               0l,
  58.     WA_Height,              0l,
  59.     WA_IDCMP,               IDCMP_CLOSEWINDOW | LISTVIEWIDCMP | SLIDERIDCMP | BUTTONIDCMP | IDCMP_REFRESHWINDOW | IDCMP_VANILLAKEY,
  60.     WA_Flags,               WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP,
  61.     WA_Gadgets,             0l,
  62.     WA_Title,               "Edit screen type:",
  63.     WA_AutoAdjust,          TRUE,
  64.     WA_Zoom,                (Tag)sc_Zoom,
  65.     WA_CustomScreen,        0l,
  66.     TAG_DONE };
  67.  
  68. UBYTE                       *sc_PalMon[] = {
  69.     "PAL Lores", "PAL Hires", "PAL Superhires",
  70.     "PAL Lores Interlaced", "PAL Hires Interlaced",
  71.     "PAL Superhires Interlaced"  };
  72. UBYTE                       *sc_NtscMon[] = {
  73.     "NTSC Lores", "NTSC Hires", "NTSC Superhires",
  74.     "NTSC Lores Interlaced", "NTSC Hires Interlaced",
  75.     "NTSC Superhires Interlaced"  };
  76.  
  77. /*
  78.  * --- This routine looks for the availability of the
  79.  * --- LORES, HIRES and SUPERHIRES displaymodes and the
  80.  * --- LACE versions too. If found they will be added to
  81.  * --- the list for the ListView gadget.
  82.  */
  83. long GetModes( long monitor )
  84. {
  85.     UBYTE                 **mon, c = 0;
  86.     WORD                    maxn, maxl;
  87.     struct ListViewNode    *node;
  88.  
  89.     if ( monitor == PAL_MONITOR_ID ) {
  90.         mon  = sc_PalMon;
  91.         maxn = 256;
  92.         maxl = 512;
  93.     } else {
  94.         mon  = sc_NtscMon;
  95.         maxn = 200;
  96.         maxl = 400;
  97.     }
  98.  
  99.     if ( NOT ModeNotAvailable( monitor | LORES_KEY )) {
  100.         if( NOT( node = MakeNode( mon[c++] )))
  101.             return FALSE;
  102.         node->ln_UserData[0] = monitor | LORES_KEY;
  103.         node->ln_UserData[1] = 5;
  104.         node->ln_UserData[2] = 320;
  105.         node->ln_UserData[3] = maxn;
  106.         AddTail( &sc_AvailModes, (struct Node *)node );
  107.     } else c++;
  108.     if ( NOT ModeNotAvailable( monitor | HIRES_KEY )) {
  109.         if( NOT( node = MakeNode( mon[c++] )))
  110.             return FALSE;
  111.         node->ln_UserData[0] = monitor | HIRES_KEY;
  112.         node->ln_UserData[1] = 4;
  113.         node->ln_UserData[2] = 640;
  114.         node->ln_UserData[3] = maxn;
  115.         AddTail( &sc_AvailModes, (struct Node *)node );
  116.     } else c++;
  117.     if ( NOT ModeNotAvailable( monitor | SUPER_KEY )) {
  118.         if( NOT( node = MakeNode( mon[c++] )))
  119.             return FALSE;
  120.         node->ln_UserData[0] = monitor | SUPER_KEY;
  121.         node->ln_UserData[1] = 2;
  122.         node->ln_UserData[2] = 1280;
  123.         node->ln_UserData[3] = maxn;
  124.         AddTail( &sc_AvailModes, (struct Node *)node );
  125.     } else c++;
  126.     if ( NOT ModeNotAvailable( monitor | LORESLACE_KEY )) {
  127.         if( NOT( node = MakeNode( mon[c++] )))
  128.             return FALSE;
  129.         node->ln_UserData[0] = monitor | LORESLACE_KEY;
  130.         node->ln_UserData[1] = 5;
  131.         node->ln_UserData[2] = 320;
  132.         node->ln_UserData[3] = maxl;
  133.         AddTail( &sc_AvailModes, (struct Node *)node );
  134.     } else c++;
  135.     if ( NOT ModeNotAvailable( monitor | HIRESLACE_KEY )) {
  136.         if( NOT( node = MakeNode( mon[c++] )))
  137.             return FALSE;
  138.         node->ln_UserData[0] = monitor | HIRESLACE_KEY;
  139.         node->ln_UserData[1] = 4;
  140.         node->ln_UserData[2] = 640;
  141.         node->ln_UserData[3] = maxl;
  142.         AddTail( &sc_AvailModes, (struct Node *)node );
  143.     } else c++;
  144.     if ( NOT ModeNotAvailable( monitor | SUPERLACE_KEY )) {
  145.         if( NOT( node = MakeNode( mon[c++] )))
  146.             return FALSE;
  147.         node->ln_UserData[0] = monitor | SUPERLACE_KEY;
  148.         node->ln_UserData[1] = 2;
  149.         node->ln_UserData[2] = 1280;
  150.         node->ln_UserData[3] = maxl;
  151.         AddTail( &sc_AvailModes, (struct Node *)node );
  152.     }
  153.     return TRUE;
  154. }
  155.  
  156. /*
  157.  * --- This routine call's GetModes() for both the PAL
  158.  * --- and NTSC monitor ID's.
  159.  */
  160. long CheckModes( struct Screen *scr )
  161. {
  162.     struct ListViewNode     *node;
  163.     struct ViewPort         *vp = &scr->ViewPort;
  164.     UWORD                    num = 0l;
  165.  
  166.     NewList( &sc_AvailModes );
  167.  
  168.     if ( NOT GetModes( PAL_MONITOR_ID ) || NOT GetModes( NTSC_MONITOR_ID )) {
  169.         FreeList( &sc_AvailModes );
  170.         return FALSE;
  171.     }
  172.  
  173.  
  174.     for ( node = ( struct ListViewNode * )sc_AvailModes.lh_Head; node->ln_Succ; node = node->ln_Succ ) {
  175.         if ( GetVPModeID( vp ) == node->ln_UserData[0] ) {
  176.             sc_ActiveMode = num;
  177.             break;
  178.         }
  179.         num++;
  180.     }
  181.  
  182.     return TRUE;
  183. }
  184.  
  185. /*
  186.  * --- Open the ScreenSelect() requester.
  187.  */
  188. long ScreenSelect( void )
  189. {
  190.     struct ListViewNode *node;
  191.     struct Gadget       *g;
  192.     struct Screen       *scr;
  193.     struct NewGadget     ng;
  194.     BOOL                 running = TRUE, lock = FALSE, ok = FALSE;
  195.     WORD                 l, t, w, h, btop, bleft;
  196.  
  197.  
  198.     if ( NOT MainScreen ) {
  199.         if( scr = LockPubScreen( 0l )) {
  200.             lock = TRUE;
  201.             GetScreenInfo( scr );
  202.         } else
  203.             return FALSE;
  204.     } else
  205.         scr = MainScreen;
  206.  
  207.     if ( NOT CheckModes( scr ))
  208.         return FALSE;
  209.  
  210.     btop  = scr->WBorTop + 1 + scr->RastPort.TxHeight;
  211.     bleft = scr->WBorLeft;
  212.  
  213.     w = bleft + scr->WBorRight  + 298;
  214.     h = btop  + scr->WBorBottom + 106;
  215.     l = (( scr->Width  >> 1 ) - ( w >> 1 ));
  216.     t = (( scr->Height >> 1 ) - ( h >> 1 ));
  217.  
  218.     sc_Zoom[0] = 0;
  219.     sc_Zoom[1] = btop;
  220.     sc_Zoom[2] = 200;
  221.     sc_Zoom[3] = btop;
  222.  
  223.     sc_nwTags[0].ti_Data = l;
  224.     sc_nwTags[1].ti_Data = t;
  225.     sc_nwTags[2].ti_Data = w;
  226.     sc_nwTags[3].ti_Data = h;
  227.  
  228.     sc_nwTags[10].ti_Data = (Tag)scr;
  229.  
  230.     if (( scr->Flags & CUSTOMSCREEN ) == CUSTOMSCREEN )
  231.         sc_nwTags[10].ti_Tag  = WA_CustomScreen;
  232.     else if (( scr->Flags & PUBLICSCREEN ) == PUBLICSCREEN )
  233.         sc_nwTags[10].ti_Tag  = WA_PubScreen;
  234.     else
  235.         sc_nwTags[10].ti_Tag = TAG_DONE;
  236.  
  237.     node = FindNode( &sc_AvailModes, sc_ActiveMode );
  238.     sc_DisplayID  = node->ln_UserData[0];
  239.     sc_Width      = node->ln_UserData[2];
  240.     sc_Height     = node->ln_UserData[3];
  241.  
  242.     sc_Depth = scr->BitMap.Depth;
  243.  
  244.     if ( g = CreateContext( &sc_GList ))  {
  245.  
  246.         ng.ng_LeftEdge      =   bleft + 8;
  247.         ng.ng_TopEdge       =   btop + 16;
  248.         ng.ng_Width         =   284;
  249.         ng.ng_Height        =   60;
  250.         ng.ng_GadgetText    =   "Available modes:";
  251.         ng.ng_TextAttr      =   &Topaz80;
  252.         ng.ng_GadgetID      =   GD_MODESELECT;
  253.         ng.ng_Flags         =   PLACETEXT_ABOVE;
  254.         ng.ng_VisualInfo    =   MainVisualInfo;
  255.         ng.ng_UserData      =   0l;
  256.  
  257.         g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Selected, sc_ActiveMode, GTLV_ShowSelected, 0l, GTLV_Labels, &sc_AvailModes, TAG_DONE );
  258.  
  259.         ng.ng_LeftEdge      =   bleft + 79;
  260.         ng.ng_TopEdge       =   btop + 76;
  261.         ng.ng_Width         =   213;
  262.         ng.ng_Height        =   10;
  263.         ng.ng_GadgetText    =   "Depth   ";
  264.         ng.ng_GadgetID      =   GD_DEPTH;
  265.         ng.ng_Flags         =   PLACETEXT_LEFT + NG_HIGHLABEL;
  266.  
  267.         g = CreateGadget( SLIDER_KIND, g, &ng, GTSL_LevelFormat, "%1ld", GTSL_MaxLevelLen, 1l, GTSL_Min, 1l, GTSL_Max, 4l, GTSL_Level, sc_Depth, TAG_DONE );
  268.  
  269.         sc_Slider = g;
  270.  
  271.         ng.ng_LeftEdge      =   bleft  +  8;
  272.         ng.ng_TopEdge       =   btop + 90;
  273.         ng.ng_Width         =   60;
  274.         ng.ng_Height        =   12;
  275.         ng.ng_GadgetText    =   "_OK";
  276.         ng.ng_Flags         =   PLACETEXT_IN;
  277.         ng.ng_GadgetID      =   GD_OK;
  278.  
  279.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  280.  
  281.         ng.ng_LeftEdge      =   236;
  282.         ng.ng_GadgetText    =   "_CANCEL";
  283.         ng.ng_GadgetID      =   GD_CANCEL;
  284.  
  285.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  286.  
  287.         if ( g ) {
  288.  
  289.             sc_nwTags[6].ti_Data = (Tag)sc_GList;
  290.  
  291.             if ( sc_Wnd = OpenWindowTagList( 0l, sc_nwTags )) {
  292.  
  293.                 sc_Zoom[0] = l;
  294.                 sc_Zoom[1] = t;
  295.                 sc_Zoom[2] = w;
  296.                 sc_Zoom[3] = h;
  297.  
  298.                 GT_RefreshWindow( sc_Wnd, 0l );
  299.  
  300.                 do {
  301.                     WaitPort( sc_Wnd->UserPort );
  302.  
  303.                     while ( ReadIMsg( sc_Wnd )) {
  304.  
  305.                         switch ( Class ) {
  306.  
  307.                             case    IDCMP_REFRESHWINDOW:
  308.                                 GT_BeginRefresh( sc_Wnd );
  309.                                 GT_EndRefresh( sc_Wnd, TRUE );
  310.                                 break;
  311.  
  312.                             case    IDCMP_CLOSEWINDOW:
  313.                                 FreeList( &sc_AvailModes );
  314.                                 running = FALSE;
  315.                                 break;
  316.  
  317.                             case    IDCMP_MOUSEMOVE:
  318.                                 switch( Object->GadgetID ) {
  319.  
  320.                                     case    GD_DEPTH:
  321.                                         sc_Depth = Code;
  322.                                         break;
  323.                                 }
  324.                                 break;
  325.  
  326.                             case    IDCMP_GADGETUP:
  327.                                 switch( Object->GadgetID ) {
  328.  
  329.                                     case    GD_MODESELECT:
  330.                                         node = FindNode( &sc_AvailModes, Code );
  331.                                         sc_DisplayID  = node->ln_UserData[0];
  332.                                         sc_Depth      = node->ln_UserData[1];
  333.                                         sc_Width      = node->ln_UserData[2];
  334.                                         sc_Height     = node->ln_UserData[3];
  335.                                         GT_SetGadgetAttrs( sc_Slider, sc_Wnd, 0l, GTSL_Min, 1l, GTSL_Max, sc_Depth, GTSL_Level, sc_Depth, TAG_DONE );
  336.                                         sc_ActiveMode = Code;
  337.                                         break;
  338.  
  339.                                     case    GD_OK:
  340.                                         Ok:
  341.                                         ok = TRUE;
  342.  
  343.                                     case    GD_CANCEL:
  344.                                         Cancel:
  345.                                         FreeList( &sc_AvailModes );
  346.                                         running = FALSE;
  347.                                         break;
  348.                                 }
  349.                                 break;
  350.  
  351.                             case    IDCMP_VANILLAKEY:
  352.                                 switch( Code ) {
  353.  
  354.                                     case    'o':
  355.                                         goto Ok;
  356.  
  357.                                     case    'c':
  358.                                         goto Cancel;
  359.                                 }
  360.                                 break;
  361.                         }
  362.                     }
  363.                 } while ( running );
  364.             }
  365.         }
  366.     }
  367.  
  368.     if ( sc_Wnd )           CloseWindow( sc_Wnd );
  369.     if ( sc_GList )         FreeGadgets( sc_GList );
  370.     if ( lock ) {
  371.         FreeScreenInfo( scr );
  372.         UnlockPubScreen( 0l, scr );
  373.     }
  374.  
  375.     sc_Wnd     = 0l;
  376.     sc_GList   =  0l;
  377.  
  378.     if ( ok ) {
  379.         MainSTags[2].ti_Data = (Tag)sc_Width;
  380.         MainSTags[3].ti_Data = (Tag)sc_Height;
  381.         MainSTags[4].ti_Data = (Tag)sc_Depth;
  382.         MainSTags[5].ti_Data = (Tag)sc_DisplayID;
  383.         return TRUE;
  384.     }
  385.  
  386.     return FALSE;
  387. }
  388.